package br.uniceub.fsw.ativos.dao;

import br.uniceub.fsw.arquitetura.persistencia.dao.BaseDAO;
import br.uniceub.fsw.arquitetura.persistencia.dao.ConstrutorSQL;
import br.uniceub.fsw.ativos.vo.AtivoVO;
import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 * Data Access Object da entidade Ativo. Essa classe é responsável por todas as 
 * operações de banco de dados relacionadas à entidade.
 * 
 @author   Igor Benício de Mesquita 20166342/8
 *         Gabriel Levi Rolim Carvalho Pereira 2056308/9
 *         Luis Gustavo Loyola dos Santos Filho 2046429/0
 */
public class AtivoDAO extends BaseDAO<AtivoVO> {

    @Override
    public void inserir(AtivoVO entidade) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("INSERT INTO TB_ATIVO(NO_ATIVO, DS_ATIVO, CD_TECNOLOGIA)");
        query.append("VALUES (?, ?, ?)");

        List<?> parametros = criarParametros(entidade.getNoAtivo(),
                entidade.getDsAtivo(), entidade.getCdTecnologia());

        Integer idGerado = (Integer) executarInsercao(query.toString(), parametros);

        entidade.setIdAtivo(idGerado);
    }

    @Override
    public void alterar(AtivoVO entidade) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("UPDATE TB_ATIVO SET NO_ATIVO = ?,");
        query.append("DS_ATIVO = ?,");
        query.append("CD_TECNOLOGIA = ?");
        query.append("WHERE ID_ATIVO = ?");

        List<?> parametros = criarParametros(entidade.getNoAtivo(), entidade.getDsAtivo(),
                entidade.getCdTecnologia(), entidade.getIdAtivo());

        executarAlteracao(query.toString(), parametros);
    }

    @Override
    public void excluir(AtivoVO entidade) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("DELETE FROM TB_ATIVO");
        query.append("WHERE ID_ATIVO = ?");

        executarAlteracao(query.toString(), criarParametros(entidade.getIdAtivo()));
    }

    @Override
    public AtivoVO consultarPorId(Serializable id) {

        AtivoVO ativo = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TB_ATIVO T WHERE T.ID_ATIVO = ?");

        ativo = consultarUm(query.toString(), criarParametros(id));

        return ativo;
    }

    @Override
    public List<AtivoVO> consultarPorExemplo(AtivoVO exemplo) {

        List<AtivoVO> listaRetorno = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TB_ATIVO T WHERE 1=1");

        mapearQueryParaExemplo(query, exemplo);

        listaRetorno = consultar(query.toString(), recuperarParametros());

        return listaRetorno;
    }

    @Override
    protected AtivoVO extrairObjetoResultado(ResultSet rs) throws SQLException {

        AtivoVO ativo = new AtivoVO();
        
        ativo.setIdAtivo(rs.getInt("ID_ATIVO"));
        ativo.setDsAtivo(rs.getString("DS_ATIVO"));
        ativo.setNoAtivo(rs.getString("NO_ATIVO"));
        ativo.setCdTecnologia(new Integer(rs.getInt("CD_TECNOLOGIA")));

        return ativo;
    }

    @Override
    protected void mapearQueryParaExemplo(ConstrutorSQL query, AtivoVO exemplo) {

        if (exemplo.getNoAtivo() != null && !exemplo.getNoAtivo().isEmpty()) {
            query.append("AND T.NO_ATIVO LIKE ?");
            adicionarParametro("%" + exemplo.getNoAtivo() + "%");
        }

        if (exemplo.getDsAtivo() != null) {
            query.append("AND T.DS_ATIVO LIKE ?");
            adicionarParametro("%" + exemplo.getDsAtivo() + "%");
        }

        if (exemplo.getCdTecnologia() != null) {
            query.append("AND T.CD_TECNOLOGIA = ?");
            adicionarParametro(exemplo.getCdTecnologia());
        }
    }
}